/**
 * @file client_parse.h
 * @author Marco Luisi
 * @brief Funzioni per il parsing di NMATC.
 *
 *
 */

#include "client_parse.h"

//fare in modo che si controlli che raw_line non sia null ptima
/**
 * 
 * @brief Spezza il buffer di input in token.
 *
 * tokenizer riceve in input il puntatore a una stringa buffer su cui chiama iterativamente la funzione
 * strtok con lo spazio come separatore.
 *
 * @param input_line puntatore al buffer da spezzare.
 * @param tokens puntatore all'array di char* per i tokens.
 *
 * @return numero di tokens.
 * @retval -1 in caso di errore.
 */
int tokenizer(char* input_line, char **tokens) { //-1 se trova errore tipo caratteri non consentiti
	int i = 0;
	int dim = 5;
	char skip[] = " \n"; //spostare fuori? | FARE MACRO | togliere newline?
	//cambiare macro poi
	//EC_NULL_E(tokens = malloc(dim * sizeof(char*)),"errore _memoria"); //allocare qui o prima?
	//cambiare macro poi, funzione di uscita..
	
	//!nuova
	if(tokens == NULL){
		printf("tokens == NULL in tokenizer\n");
		tokens = (char**)malloc( dim * sizeof(char*));
	}
	
	
	EC_NULL(tokens[i] = strtok(input_line, skip)); ///se non ci sono token esce subito con codice d'errore
	i++;
	//si può rifare tutto il parse mettendo qui una funzione che controlla i token via via
	//contestualmente all'indice
	while( (tokens[i] = strtok(NULL, skip)) ){
		if(i == dim) {
			dim *= 2;
			//cambiare macro
			EC_NULL_E(tokens = (char**)realloc(tokens,dim * sizeof(char*)),"errore _memoria");
		}
		i++;
	}
	//realloc finale?
	//cambiare macro
	EC_NULL_E(tokens = (char**)realloc(tokens,i * sizeof(char*)),"errore _memoria");
	return i;
}


/**
 * 
 * @brief Controlla la validità del nome della matrice.
 *
 *	Scorre tutti i caratteri della stringa passata per riferimento, per controllarne la conformità
 *	allo standard stabilito per i nomi.
 * @param name
 * @return codice di controllo
 * @retval 1 se la stringa è conforme
 * @retval -1 se la stringa non è conforme
 */
int name_check(char *name){//controllare prima lunghezza o qui??
	int i;
	int len = strlen(name); //controllare prima lunghezza o qui??
	if ( !(isalpha(name[0])) ){
		return -1;
	}
	for(i = 1; i< len; i++) {
		if( !(isalnum(name[i])) )
			return -1;
	}
	return 1;
}

/**
 * @param num
 * @param d
 * @return intero per segnalare l'esito della conversione.
 * @retval 0 se è non è presente il terminatore di riga.
 * @retval 1 se è presente il terminatore di riga.
 * @retval -1 se è stato rilevato un errore.
 */
int num_check(char *num, double *d) { //si presume vengano passate già stringhe senza spazi
	//provare ad usare variabile statica per la dim della linea/numero colonne
	char* c;
	*d = strtod(num, &c); //ok?
	printf("DEBUG NUM_CHECK:parse di %convertito in %f, endpntr =|%s|\n", num, *d, c);
	if (strcmp(c, ";") == 0) {
		return 1;
	}
	if (strcmp(c, "\0") != 0) { //se c'è un carattere, o più dopo il numero
		return -1; //errore
	}

	return 0;
}
